package cn.meng.base.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * RabbitMQ配置类：（Direct模式）
 * @author 万梦辉
 *
 * 1、声明注册对应模式的交换机
 * 2、声明注册队列
 * 3、完成交换机与队列的绑定
 *
 */
@Configuration
public class DirectRabbitMqConfig {

    /**
     * 设置默认的过期时间为 5分钟
     */
    private int TIME = 1000 * 60 * 5;
//    private int TIME = 5000;

    /**
     * 声明fanout交换机   交换机的名称为：direct_message_exchange
     * @return
     */
    @Bean
    public DirectExchange fanoutExchange (){
        return new DirectExchange("direct_message_exchange");
    }

    /**
     * 声明一个队列（邮件使用），并设置过期时间，以及对应的  死信队列
     * @return
     */
    @Bean
    public Queue emailQueue () {
        HashMap<String, Object> params = new HashMap<>();
        //设置队列消息过期时间
        params.put("x-message-ttl",TIME);
        //设置对应处理的过期时间的死信队列对应的交换机
        params.put("x-dead-letter-exchange","dead_direct_exchange");
        //设置对应处理过期消息的死信队列
        params.put("x-dead-letter-routing-key","emailDead");
        return new Queue("email.fanout.queue",true,false,false,params);
    }

    /**
     * 声明一个队列（微信公众号推消息使用），并设置过期时间，以及对应的  死信队列
     * @return
     */
    @Bean
    public Queue weChatQueue () {
        HashMap<String, Object> params = new HashMap<>();
        //设置队列消息过期时间
        params.put("x-message-ttl",TIME);
        //设置对应处理的过期时间的死信队列对应的交换机
        params.put("x-dead-letter-exchange","dead_direct_exchange");
        //设置对应处理过期消息的死信队列
        params.put("x-dead-letter-routing-key","weChatDead");
        return new Queue("weChat.fanout.queue",true,false,false,params);
    }

    /**
     * 绑定交互机与队列
     * @return
     */
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange()).with("email");
    }

    /**
     * 绑定交互机与队列
     * @return
     */
    @Bean
    public Binding weChatBinding() {
        return BindingBuilder.bind(weChatQueue()).to(fanoutExchange()).with("weChat");
    }

}
